/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dp1.pucp.Compras.Controlador;

import com.dp1.pucp.Compras.DAO.OrdenCompraDAO;
import com.dp1.pucp.Compras.VIsta.IngresarCantMPGUI;
import com.dp1.pucp.Compras.VIsta.OrdenCompraGUI;
import com.dp1.pucp.Modelo.Clases.Kardex;
import com.dp1.pucp.Modelo.Clases.Lineaordencompra;
import com.dp1.pucp.Modelo.Clases.Materiaprima;
import com.dp1.pucp.Modelo.Clases.Ordencompra;
import com.dp1.pucp.Modelo.Clases.Pedidocompra;
import com.dp1.pucp.Modelo.Clases.Simulacion;
import com.dp1.pucp.Modelo.Clases.Tipoproducto;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Date;

/**
 *
 * @author ubuntu64
 */
public class IngresarCantMPControlador {
    private OrdenCompraDAO m;
    private IngresarCantMPGUI IngresarCantView;
    private OrdenCompraGUI ordenCompraView;
    private Lineaordencompra lineaorden;
    private Pedidocompra pedidocompra;
    private OrdenCompraControlador ordenCont;
    private Ordencompra ordenCompra;
    private ArrayList<Lineaordencompra> lstLineaorden;
    private int numOrdenesFinalizadas=0;
    
    public IngresarCantMPControlador(OrdenCompraDAO dao, IngresarCantMPGUI view, OrdenCompraControlador ordenControlador, Lineaordencompra lineaOrden, OrdenCompraGUI ordenView){
        m = dao;
        IngresarCantView = view;
        lineaorden=lineaOrden;
        ordenCont= ordenControlador;
        ordenCompra=lineaorden.getOrdencompra();
        pedidocompra=m.sacarPedidoCompra(lineaorden.getLineapedidocompra().getPedidocompra().getIdpedidocompra());
        IngresarCantView.setFormOrden(lineaorden);
        lstLineaorden=m.listarLineaOrdenCompra(ordenCompra);
        ordenCompraView=ordenView;
     
        IngresarCantView.addCancelarListener(new cancelarListener());         
        IngresarCantView.addGuardarListener(new guardarOrdenListener());

    }
    
    class cancelarListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            IngresarCantView.dispose();
        }        
    }
    
    class guardarOrdenListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            float cantEntra=Float.parseFloat(IngresarCantView.getCantidad());
            float cantSol=lineaorden.getCantidadSolicitante();
            float cantFal=lineaorden.getCantidadFaltante();
            float cantEnt=lineaorden.getCantidadEntrante();
            float nuevaCant=cantEnt+cantEntra; //con esta cantidad se debe actualizar la tabla
            if (cantEntra>cantFal){
                IngresarCantView.mostrarError("La cantidad faltante es menor a la cantidad ingresada");
                return;
            }
            int cantOrdenesfinalizadas=pedidocompra.getNumordcomprafinalizadas();
            int cantOrdenes=pedidocompra.getNumordcompratotal();
            lineaorden.setCantidadEntrante(nuevaCant);
            lineaorden.setCantidadFaltante(cantSol-nuevaCant);
            lineaorden.setFechaCaducidad(IngresarCantView.getFechaCaducidad());
            ordenCompra.setFecharecepcion(new Date());
            
            m.guardarLineaOrdenCompra(lineaorden);   
            m.guardarOrdenCompra(ordenCompra);
            lstLineaorden =m.listarLineaOrdenCompra(ordenCompra);
            
            
            int aux=0;
            for(int i=0; i<lstLineaorden.size(); i++){
                if (lstLineaorden.get(i).getCantidadFaltante()==0)
                    aux++;
            }
            if (aux==lstLineaorden.size()){
                ordenCompra.setEstado(3);//el estado 3 es recibido
                IngresarCantView.mostrarAviso("La Orden de Compra " + ordenCompra.getCodigo() + " se ha recibido completa");
                cantOrdenesfinalizadas++;
                pedidocompra.setNumordcomprafinalizadas(cantOrdenesfinalizadas);
            }
                
            else
                ordenCompra.setEstado(2); //el estado 2 es pendiente, es decir que no termin+o de recibir todo aun
            if (cantOrdenesfinalizadas==cantOrdenes){
                pedidocompra.setEstado(3); // el estado 3 es finalizado
                actualizarSimulacion(pedidocompra);
            }
            
            m.guardarLineaOrdenCompra(lineaorden);   
            m.guardarOrdenCompra(ordenCompra);
            m.guardarPedidoCompra(pedidocompra);
                       
            aumentarStock(lineaorden, cantEntra);  
                 
            
            IngresarCantView.dispose();
//            ordenCompraView.setFormOrden(ordenCompra, 3);
             //para refrescar la anterior ventana
//             OrdenCompraGUI p = new OrdenCompraGUI(null, true);
//                             
//              OrdenCompraControlador c = new OrdenCompraControlador (m,p,ordenCompra,3);
//              p.setVisible(true); 
            ordenCont.Actualizardatos(ordenCompra.getIdordencompra());
            
        }
    }
    
    public void actualizarSimulacion(Pedidocompra pedido){
        ArrayList <Simulacion> lstSimulacion = m.listarSimulacion(pedido.getIdpedidocompra());
         for(int i=0; i<lstSimulacion.size(); i++){
                lstSimulacion.get(i).setEstado(9);
                m.guardarSimulacion(lstSimulacion.get(i));
            }
    }
    
    public void aumentarStock(Lineaordencompra lineaOrden, float cant){
       float stockactual, stockentrante, stockfinal = 0f;
       
        Materiaprima matPrima = m.sacarMateriaPrima(lineaOrden.getLineapedidocompra().getTipoproducto().getIdtipoproducto());
        Tipoproducto tp= m.sacarTipoProducto(lineaOrden.getLineapedidocompra().getTipoproducto().getIdtipoproducto());
        stockactual = (float)matPrima.getCantidad();
        stockentrante = cant;
        stockfinal = stockactual+cant;
        matPrima.setCantidad((int)stockfinal); //no deberia castearlo, pero solo para q entre como int
        matPrima.setFechaCaducidad(lineaOrden.getFechaCaducidad());
        m.guardarMateriaPrima(matPrima);
        // el kardex
            
            Kardex k = new Kardex();
            k.setFecha(new Date());
            k.setHora(new Date());
            k.setEstado(1); // 1 indica que se realizo el movimiento
            k.setTipo("MP"); // 1 indica que se realizo el movimiento
            k.setCantidad((long)stockentrante);
            k.setEntradasalida('E');
            k.setTipoproducto(tp);
            k.setAlmacen(matPrima.getAlmacen());
            k.setMotivo("Ingreso por compra a proveedor");
            m.guardarKardex(k);
            
        }
       
    
    
}
